package user

import (
	"encoding/json"
	"fmt"
	"goProject/api/auth"
	"goProject/db"
	"goProject/table"
	"net/http"
	"sync"

	"gitee.com/ruige_fun/util/std"
	"github.com/kataras/iris/v12"
)

func menu(c iris.Context) {
	var result = make([]table.MenuDir, 0)
	roleID, _ := c.Values().GetInt(fmt.Sprint(c.GetID()))
	if roleID <= 0 {
		c.JSON(std.NewResp(http.StatusOK, "", result, nil))
		return
	}
	body, err := auth.RoleMenuCache.Get(fmt.Sprint(roleID)) //获取当前角色的菜单响应缓存
	if err == nil {
		_ = json.Unmarshal([]byte(body), &result)
	} else {
		switch roleID {
		case 1: //root用户，所有权限
			db.MySQL.Order("`sort` ASC").Preload("Items").Find(&result)
		case 2: //admin用户，除了root以外的所有权限
			db.MySQL.Where("`id` > ?", 1).Order("`sort` ASC").Preload("Items").Find(&result)
		default:
			var temp []table.MenuDir //获取所有的非ROOT、非Admin的普通用户菜单项
			db.MySQL.Where("`id` > ?", 2).Order("`sort` ASC").Preload("Items").Find(&temp)

			var allItem []table.RoleMenuItem //获取当前角色，拥有的所有菜单项（页面）
			db.MySQL.Where("`role_id` = ?", roleID).Find(&allItem)
			var have = sync.Map{} //记录当前角色，拥有的菜单项（页面）ID
			for _, d := range allItem {
				have.Store(fmt.Sprint(d.MenuItemID), byte(0))
			}

			for _, d := range temp {
				if len(d.Items) <= 0 {
					//过滤掉没有实际页面的菜单折叠项
					continue
				}
				var newMenuDir = table.MenuDir{ID: d.ID, Path: d.Path, Icon: d.Icon, Label: d.Label, Sort: d.Sort}
				for _, item := range d.Items {
					if _, ok := have.Load(fmt.Sprint(item.ID)); ok {
						newMenuDir.Items = append(newMenuDir.Items, item)
					}
				}
				if len(newMenuDir.Items) > 0 { //当前角色，有菜单项（页面）的，才会追加到菜单结果里面去。
					result = append(result, d)
				}
			}
		}
		marshal, _ := json.Marshal(&result)
		_ = auth.RoleMenuCache.Set(fmt.Sprint(roleID), string(marshal)) //保存一下菜单缓存，一般角色菜单权限，不会随意改，所以为了保证速度快，建立以下缓存。
	}
	c.JSON(std.NewResp(http.StatusOK, "", result, nil))
}
